﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Dominio;

namespace Interfaz
{
    public partial class VentanaClientes : UserControl
    {
        
        #region atributos

        private static VentanaClientes instance;
        private List<Cliente> lClientes;
        List<PlanDePago> lPlanesDePago;
        private int ultimoIdCliente;
        private bool ingreso;
        private Cliente actualCliente;

        #endregion

        #region constructor

        private VentanaClientes()
        {
            InitializeComponent();            
            ultimoIdCliente = Sistema.getUltimoIdCliente();
            lPlanesDePago = Sistema.getPlanesDePago();
            comboPlan.DataSource = lPlanesDePago.ToArray();
            PlanDePago planAux = new PlanDePago();
            planAux.OID = -1;
            lPlanesDePago.Add(planAux);
            comboBoxBuscarPlan.DataSource = lPlanesDePago.ToArray();
            comboBoxBuscarPlan.SelectedIndex = -1;                        
            lClientes = new List<Cliente>();
            limpiarCampos();
        }

        public static VentanaClientes getInstance()
        {
            if (instance == null)
            {
                instance = new VentanaClientes();
            }
            instance.limpiarCampos();
            return instance;
        }

        #endregion

        #region eventos

        private void buttonBuscar_Click(object sender, EventArgs e)
        {
            double saldoDesde = double.Parse(textBoxBuscarSaldoDesde.Text);
            double saldoHasta = double.Parse(textBoxBuscarSaldoHasta.Text);
            int idDesde = int.Parse(textBoxBuscarIdDesde.Text);
            int idHasta = int.Parse(textBoxBuscarIdHasta.Text);
            int idPlan = -1;
            if(comboBoxBuscarPlan.SelectedIndex != -1)
            {
                PlanDePago planDePago = (PlanDePago)comboBoxBuscarPlan.SelectedItem;
                idPlan = planDePago.OID;
            }
            lClientes = Sistema.buscarClientes(textBoxBuscarNombre.Text, saldoDesde, saldoHasta,
                textBoxBuscarRUT.Text, idDesde, idHasta, idPlan, textBoxBuscarDireccion.Text);
            cargarListaClientes();
        }

        private void BotonAceptar_Click(object sender, EventArgs e)
        {
            if (validarDatos())
            {
                int fax = int.Parse(TextoFax.Text);
                PlanDePago unPlan = (PlanDePago)comboPlan.SelectedItem;
                actualCliente.Nombre = TextoNombre.Text;
                actualCliente.Direccion = TextoDireccion.Text;
                actualCliente.EMail = TextoMail.Text;
                actualCliente.Fax = int.Parse(TextoFax.Text);
                actualCliente.PlanDePago = unPlan;
                actualCliente.RUT = TextoRUT.Text;
                if (ingreso)
                {
                    ultimoIdCliente += 1;
                    actualCliente.OID = ultimoIdCliente;
                    Sistema.agregarCliente(TextoDireccion.Text, TextoMail.Text, fax,
                        TextoNombre.Text, unPlan, TextoRUT.Text); 
                    lClientes.Add(actualCliente);
                    limpiarCampos();
                }
                else
                {
                    Sistema.modificarCliente(TextoDireccion.Text, TextoMail.Text, fax,
                        TextoNombre.Text, unPlan, TextoRUT.Text, true, actualCliente); 
                    limpiarCampos();
                }
            }
        }

        private void buttonNuevo_Click(object sender, EventArgs e)
        {
            limpiarCampos();
        }

        private void buttonEliminar_Click(object sender, EventArgs e)
        {
            try
            {
                if (listaClientes.SelectedIndices[0] != -1)
                {
                    Sistema.eliminarCliente(actualCliente);
                    lClientes.Remove(actualCliente);
                    limpiarCampos();
                }
            }
            catch (Exception) { }
        }

        private void listaClientes_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                if (listaClientes.SelectedItems[0] != null)
                {
                    ingreso = false;
                    ListViewItem item = (ListViewItem)listaClientes.Items[listaClientes.SelectedIndices[0]];
                    actualCliente = (Cliente)item.Tag;
                    LabelID.Text = actualCliente.OID.ToString();
                    TextoNombre.Text = actualCliente.Nombre;
                    TextoDireccion.Text = actualCliente.Direccion;
                    TextoRUT.Text = actualCliente.RUT;
                    TextoFax.Text = actualCliente.Fax.ToString();
                    TextoMail.Text = actualCliente.EMail;
                    ListaTelefonos.DataSource = actualCliente.Telefonos.ToArray();
                    buscarPosicionDePlan();
                }
            }
            catch (Exception) { }
        }

        private void textBoxBuscarIdDesde_TextChanged(object sender, EventArgs e)
        {
            try
            {
                int nro = int.Parse(textBoxBuscarIdDesde.Text);
            }
            catch
            {
                textBoxBuscarIdDesde.Text = "0";
            }
        }

        private void textBoxBuscarIdHasta_TextChanged(object sender, EventArgs e)
        {
            try
            {
                int nro = int.Parse(textBoxBuscarIdHasta.Text);
            }
            catch
            {
                textBoxBuscarIdHasta.Text = "1000000";
            }
        }

        private void textBoxBuscarSaldoDesde_TextChanged(object sender, EventArgs e)
        {
            try
            {
                double nro = double.Parse(textBoxBuscarSaldoDesde.Text);
            }
            catch
            {
                textBoxBuscarSaldoDesde.Text = "0";
            }
        }

        private void textBoxBuscarSaldoHasta_TextChanged(object sender, EventArgs e)
        {
            try
            {
                double nro = double.Parse(textBoxBuscarSaldoHasta.Text);
            }
            catch
            {
                textBoxBuscarSaldoHasta.Text = "2000000";
            }
        }

        #endregion

        #region metodos

        private bool validarDatos()
        {
            bool ok = true;
            if (TextoNombre.Text.Equals("") && ok)
            {
                MessageBox.Show("Error. Nombre vacío");
                ok = false;
            }
            if (TextoDireccion.Text.Equals("") && ok)
            {
                MessageBox.Show("Error. Dirección vacía");
                ok = false;
            }
            if (TextoRUT.Text.Equals("") && ok)
            {
                MessageBox.Show("Error. RUT vacío");
                ok = false;
            }
            if (comboPlan.SelectedIndex == -1 && ok)
            {
                MessageBox.Show("Error. Debe seleccionar un plan de pago para el cliente");
                ok = false;
            }
            return ok;
        }

        private void limpiarCampos()
        {
            ingreso = true;
            TextoNombre.Text = "";
            TextoDireccion.Text = "";
            TextoTelefono.Text = "";
            ListaTelefonos.DataSource = new List<string>().ToArray();
            TextoRUT.Text = "";
            comboPlan.SelectedIndex = -1;
            TextoFax.Text = "0";
            TextoMail.Text = "";
            LabelID.Text = "";
            cargarListaClientes();
            actualCliente = new Cliente();
        }

        private void buscarPosicionDePlan()
        {
            for (int i = 0; i < comboPlan.Items.Count; i++)
            {
                PlanDePago planAux = (PlanDePago)comboPlan.Items[i];
                if (actualCliente.PlanDePago.OID == planAux.OID)
                {
                    comboPlan.SelectedIndex = i;
                }
            }
        }
        private void cargarListaClientes()
        {
            listaClientes.Items.Clear();
            for (int i = 0; i < lClientes.Count; i++)
            {
                ListViewItem itemCliente = new ListViewItem();
                itemCliente.Text = lClientes[i].OID.ToString();
                itemCliente.Tag = lClientes[i];
                listaClientes.Items.Add(itemCliente);
                listaClientes.Items[i].SubItems.Add(lClientes[i].RUT);
                listaClientes.Items[i].SubItems.Add(lClientes[i].Nombre);
            }
        }

        #endregion

        private void labelSaldoA_Click(object sender, EventArgs e)
        {

        }

    }
}
